// Copyright (c) Alexandre Mutel. All rights reserved.
// This file is licensed under the BSD-Clause 2 license. 
// See the license.txt file in the project root for more information.

using Markdig.Helpers;

namespace Markdig.Extensions.Emoji;

/// <summary>
/// An emoji shortcodes and smileys mapping, to be used by <see cref="EmojiParser"/>.
/// </summary>
public class EmojiMapping
{
    /// <summary>
    /// The default emoji shortcodes and smileys mapping.
    /// </summary>
    public static readonly EmojiMapping DefaultEmojisAndSmileysMapping = new EmojiMapping();

    /// <summary>
    /// The default emoji shortcodes mapping, without smileys.
    /// </summary>
    public static readonly EmojiMapping DefaultEmojisOnlyMapping = new EmojiMapping(enableSmileys: false);

    internal CompactPrefixTree<string> PrefixTree { get; }

    internal char[] OpeningCharacters { get; }

    #region Emojis and Smileys

    /// <summary>
    /// Returns a new instance of the default emoji shortcode to emoji unicode dictionary.
    /// It can be used to create a customized <see cref="EmojiMapping"/>.
    /// </summary>
    public static IDictionary<string, string> GetDefaultEmojiShortcodeToUnicode()
    {
        return new Dictionary<string, string>(1603)
        {
            {":100:", "💯"},
            {":1234:", "🔢"},
            {":smile:", "😄"},
            {":smiley:", "😃"},
            {":grinning:", "😀"},
            {":blush:", "😊"},
            {":relaxed:", "☺️"},
            {":wink:", "😉"},
            {":heart_eyes:", "😍"},
            {":kissing_heart:", "😘"},
            {":kissing_closed_eyes:", "😚"},
            {":kissing:", "😗"},
            {":kissing_smiling_eyes:", "😙"},
            {":stuck_out_tongue_winking_eye:", "😜"},
            {":stuck_out_tongue_closed_eyes:", "😝"},
            {":stuck_out_tongue:", "😛"},
            {":flushed:", "😳"},
            {":grin:", "😁"},
            {":pensive:", "😔"},
            {":relieved:", "😌"},
            {":unamused:", "😒"},
            {":disappointed:", "😞"},
            {":persevere:", "😣"},
            {":cry:", "😢"},
            {":joy:", "😂"},
            {":sob:", "😭"},
            {":sleepy:", "😪"},
            {":disappointed_relieved:", "😥"},
            {":cold_sweat:", "😰"},
            {":sweat_smile:", "😅"},
            {":sweat:", "😓"},
            {":weary:", "😩"},
            {":tired_face:", "😫"},
            {":fearful:", "😨"},
            {":scream:", "😱"},
            {":angry:", "😠"},
            {":rage:", "😡"},
            {":triumph:", "😤"},
            {":confounded:", "😖"},
            {":laughing:", "😆"},
            {":satisfied:", "😆"},
            {":yum:", "😋"},
            {":mask:", "😷"},
            {":sunglasses:", "😎"},
            {":sleeping:", "😴"},
            {":dizzy_face:", "😵"},
            {":astonished:", "😲"},
            {":worried:", "😟"},
            {":frowning:", "😦"},
            {":anguished:", "😧"},
            {":smiling_imp:", "😈"},
            {":imp:", "👿"},
            {":open_mouth:", "😮"},
            {":grimacing:", "😬"},
            {":neutral_face:", "😐"},
            {":confused:", "😕"},
            {":hushed:", "😯"},
            {":no_mouth:", "😶"},
            {":innocent:", "😇"},
            {":smirk:", "😏"},
            {":expressionless:", "😑"},
            {":man_with_gua_pi_mao:", "👲"},
            {":man_with_turban:", "👳"},
            {":cop:", "👮"},
            {":construction_worker:", "👷"},
            {":guardsman:", "💂"},
            {":baby:", "👶"},
            {":boy:", "👦"},
            {":girl:", "👧"},
            {":man:", "👨"},
            {":woman:", "👩"},
            {":older_man:", "👴"},
            {":older_woman:", "👵"},
            {":person_with_blond_hair:", "👱"},
            {":angel:", "👼"},
            {":princess:", "👸"},
            {":smiley_cat:", "😺"},
            {":smile_cat:", "😸"},
            {":heart_eyes_cat:", "😻"},
            {":kissing_cat:", "😽"},
            {":smirk_cat:", "😼"},
            {":scream_cat:", "🙀"},
            {":crying_cat_face:", "😿"},
            {":joy_cat:", "😹"},
            {":pouting_cat:", "😾"},
            {":japanese_ogre:", "👹"},
            {":japanese_goblin:", "👺"},
            {":see_no_evil:", "🙈"},
            {":hear_no_evil:", "🙉"},
            {":speak_no_evil:", "🙊"},
            {":skull:", "💀"},
            {":alien:", "👽"},
            {":hankey:", "💩"},
            {":poop:", "💩"},
            {":shit:", "💩"},
            {":fire:", "🔥"},
            {":sparkles:", "✨"},
            {":star2:", "🌟"},
            {":dizzy:", "💫"},
            {":boom:", "💥"},
            {":collision:", "💥"},
            {":anger:", "💢"},
            {":sweat_drops:", "💦"},
            {":droplet:", "💧"},
            {":zzz:", "💤"},
            {":dash:", "💨"},
            {":ear:", "👂"},
            {":eyes:", "👀"},
            {":nose:", "👃"},
            {":tongue:", "👅"},
            {":lips:", "👄"},
            {":+1:", "👍"},
            {":thumbsup:", "👍"},
            {":-1:", "👎"},
            {":thumbsdown:", "👎"},
            {":ok_hand:", "👌"},
            {":facepunch:", "👊"},
            {":punch:", "👊"},
            {":fist:", "✊"},
            {":v:", "✌️"},
            {":wave:", "👋"},
            {":hand:", "✋"},
            {":raised_hand:", "✋"},
            {":open_hands:", "👐"},
            {":point_up_2:", "👆"},
            {":point_down:", "👇"},
            {":point_right:", "👉"},
            {":point_left:", "👈"},
            {":raised_hands:", "🙌"},
            {":pray:", "🙏"},
            {":point_up:", "☝️"},
            {":clap:", "👏"},
            {":muscle:", "💪"},
            {":walking:", "🚶"},
            {":runner:", "🏃"},
            {":running:", "🏃"},
            {":dancer:", "💃"},
            {":couple:", "👫"},
            {":family:", "👪"},
            {":two_men_holding_hands:", "👬"},
            {":two_women_holding_hands:", "👭"},
            {":couplekiss:", "💏"},
            {":couple_with_heart:", "💑"},
            {":dancers:", "👯"},
            {":ok_woman:", "🙆"},
            {":no_good:", "🙅"},
            {":information_desk_person:", "💁"},
            {":raising_hand:", "🙋"},
            {":massage:", "💆"},
            {":haircut:", "💇"},
            {":nail_care:", "💅"},
            {":bride_with_veil:", "👰"},
            {":person_with_pouting_face:", "🙎"},
            {":person_frowning:", "🙍"},
            {":bow:", "🙇"},
            {":tophat:", "🎩"},
            {":crown:", "👑"},
            {":womans_hat:", "👒"},
            {":athletic_shoe:", "👟"},
            {":mans_shoe:", "👞"},
            {":shoe:", "👞"},
            {":sandal:", "👡"},
            {":high_heel:", "👠"},
            {":boot:", "👢"},
            {":shirt:", "👕"},
            {":tshirt:", "👕"},
            {":necktie:", "👔"},
            {":womans_clothes:", "👚"},
            {":dress:", "👗"},
            {":running_shirt_with_sash:", "🎽"},
            {":jeans:", "👖"},
            {":kimono:", "👘"},
            {":bikini:", "👙"},
            {":briefcase:", "💼"},
            {":handbag:", "👜"},
            {":pouch:", "👝"},
            {":purse:", "👛"},
            {":eyeglasses:", "👓"},
            {":ribbon:", "🎀"},
            {":closed_umbrella:", "🌂"},
            {":lipstick:", "💄"},
            {":yellow_heart:", "💛"},
            {":blue_heart:", "💙"},
            {":purple_heart:", "💜"},
            {":green_heart:", "💚"},
            {":heart:", "❤️"},
            {":broken_heart:", "💔"},
            {":heartpulse:", "💗"},
            {":heartbeat:", "💓"},
            {":two_hearts:", "💕"},
            {":sparkling_heart:", "💖"},
            {":revolving_hearts:", "💞"},
            {":cupid:", "💘"},
            {":love_letter:", "💌"},
            {":kiss:", "💋"},
            {":ring:", "💍"},
            {":gem:", "💎"},
            {":bust_in_silhouette:", "👤"},
            {":busts_in_silhouette:", "👥"},
            {":speech_balloon:", "💬"},
            {":footprints:", "👣"},
            {":thought_balloon:", "💭"},
            {":dog:", "🐶"},
            {":wolf:", "🐺"},
            {":cat:", "🐱"},
            {":mouse:", "🐭"},
            {":hamster:", "🐹"},
            {":rabbit:", "🐰"},
            {":frog:", "🐸"},
            {":tiger:", "🐯"},
            {":koala:", "🐨"},
            {":bear:", "🐻"},
            {":pig:", "🐷"},
            {":pig_nose:", "🐽"},
            {":cow:", "🐮"},
            {":boar:", "🐗"},
            {":monkey_face:", "🐵"},
            {":monkey:", "🐒"},
            {":horse:", "🐴"},
            {":sheep:", "🐑"},
            {":elephant:", "🐘"},
            {":panda_face:", "🐼"},
            {":penguin:", "🐧"},
            {":bird:", "🐦"},
            {":baby_chick:", "🐤"},
            {":hatched_chick:", "🐥"},
            {":hatching_chick:", "🐣"},
            {":chicken:", "🐔"},
            {":snake:", "🐍"},
            {":turtle:", "🐢"},
            {":bug:", "🐛"},
            {":bee:", "🐝"},
            {":honeybee:", "🐝"},
            {":ant:", "🐜"},
            {":beetle:", "🐞"},
            {":snail:", "🐌"},
            {":octopus:", "🐙"},
            {":shell:", "🐚"},
            {":tropical_fish:", "🐠"},
            {":fish:", "🐟"},
            {":dolphin:", "🐬"},
            {":flipper:", "🐬"},
            {":whale:", "🐳"},
            {":whale2:", "🐋"},
            {":cow2:", "🐄"},
            {":ram:", "🐏"},
            {":rat:", "🐀"},
            {":water_buffalo:", "🐃"},
            {":tiger2:", "🐅"},
            {":rabbit2:", "🐇"},
            {":dragon:", "🐉"},
            {":racehorse:", "🐎"},
            {":goat:", "🐐"},
            {":rooster:", "🐓"},
            {":dog2:", "🐕"},
            {":pig2:", "🐖"},
            {":mouse2:", "🐁"},
            {":ox:", "🐂"},
            {":dragon_face:", "🐲"},
            {":blowfish:", "🐡"},
            {":crocodile:", "🐊"},
            {":camel:", "🐫"},
            {":dromedary_camel:", "🐪"},
            {":leopard:", "🐆"},
            {":cat2:", "🐈"},
            {":poodle:", "🐩"},
            {":feet:", "🐾"},
            {":paw_prints:", "🐾"},
            {":bouquet:", "💐"},
            {":cherry_blossom:", "🌸"},
            {":tulip:", "🌷"},
            {":four_leaf_clover:", "🍀"},
            {":rose:", "🌹"},
            {":sunflower:", "🌻"},
            {":hibiscus:", "🌺"},
            {":maple_leaf:", "🍁"},
            {":leaves:", "🍃"},
            {":fallen_leaf:", "🍂"},
            {":herb:", "🌿"},
            {":ear_of_rice:", "🌾"},
            {":mushroom:", "🍄"},
            {":cactus:", "🌵"},
            {":palm_tree:", "🌴"},
            {":evergreen_tree:", "🌲"},
            {":deciduous_tree:", "🌳"},
            {":chestnut:", "🌰"},
            {":seedling:", "🌱"},
            {":blossom:", "🌼"},
            {":globe_with_meridians:", "🌐"},
            {":sun_with_face:", "🌞"},
            {":full_moon_with_face:", "🌝"},
            {":new_moon_with_face:", "🌚"},
            {":new_moon:", "🌑"},
            {":waxing_crescent_moon:", "🌒"},
            {":first_quarter_moon:", "🌓"},
            {":moon:", "🌔"},
            {":waxing_gibbous_moon:", "🌔"},
            {":full_moon:", "🌕"},
            {":waning_gibbous_moon:", "🌖"},
            {":last_quarter_moon:", "🌗"},
            {":waning_crescent_moon:", "🌘"},
            {":last_quarter_moon_with_face:", "🌜"},
            {":first_quarter_moon_with_face:", "🌛"},
            {":crescent_moon:", "🌙"},
            {":earth_africa:", "🌍"},
            {":earth_americas:", "🌎"},
            {":earth_asia:", "🌏"},
            {":volcano:", "🌋"},
            {":milky_way:", "🌌"},
            {":stars:", "🌠"},
            {":star:", "⭐"},
            {":sunny:", "☀️"},
            {":partly_sunny:", "⛅"},
            {":cloud:", "☁️"},
            {":zap:", "⚡"},
            {":umbrella:", "☔"},
            {":snowflake:", "❄️"},
            {":snowman:", "⛄"},
            {":cyclone:", "🌀"},
            {":foggy:", "🌁"},
            {":rainbow:", "🌈"},
            {":ocean:", "🌊"},
            {":bamboo:", "🎍"},
            {":gift_heart:", "💝"},
            {":dolls:", "🎎"},
            {":school_satchel:", "🎒"},
            {":mortar_board:", "🎓"},
            {":flags:", "🎏"},
            {":fireworks:", "🎆"},
            {":sparkler:", "🎇"},
            {":wind_chime:", "🎐"},
            {":rice_scene:", "🎑"},
            {":jack_o_lantern:", "🎃"},
            {":ghost:", "👻"},
            {":santa:", "🎅"},
            {":christmas_tree:", "🎄"},
            {":gift:", "🎁"},
            {":tanabata_tree:", "🎋"},
            {":tada:", "🎉"},
            {":confetti_ball:", "🎊"},
            {":balloon:", "🎈"},
            {":crossed_flags:", "🎌"},
            {":crystal_ball:", "🔮"},
            {":movie_camera:", "🎥"},
            {":camera:", "📷"},
            {":video_camera:", "📹"},
            {":vhs:", "📼"},
            {":cd:", "💿"},
            {":dvd:", "📀"},
            {":minidisc:", "💽"},
            {":floppy_disk:", "💾"},
            {":computer:", "💻"},
            {":iphone:", "📱"},
            {":phone:", "☎️"},
            {":telephone:", "☎️"},
            {":telephone_receiver:", "📞"},
            {":pager:", "📟"},
            {":fax:", "📠"},
            {":satellite:", "📡"},
            {":tv:", "📺"},
            {":radio:", "📻"},
            {":loud_sound:", "🔊"},
            {":sound:", "🔉"},
            {":speaker:", "🔈"},
            {":mute:", "🔇"},
            {":bell:", "🔔"},
            {":no_bell:", "🔕"},
            {":loudspeaker:", "📢"},
            {":mega:", "📣"},
            {":hourglass_flowing_sand:", "⏳"},
            {":hourglass:", "⌛"},
            {":alarm_clock:", "⏰"},
            {":watch:", "⌚"},
            {":unlock:", "🔓"},
            {":lock:", "🔒"},
            {":lock_with_ink_pen:", "🔏"},
            {":closed_lock_with_key:", "🔐"},
            {":key:", "🔑"},
            {":mag_right:", "🔎"},
            {":bulb:", "💡"},
            {":flashlight:", "🔦"},
            {":high_brightness:", "🔆"},
            {":low_brightness:", "🔅"},
            {":electric_plug:", "🔌"},
            {":battery:", "🔋"},
            {":mag:", "🔍"},
            {":bathtub:", "🛁"},
            {":bath:", "🛀"},
            {":shower:", "🚿"},
            {":toilet:", "🚽"},
            {":wrench:", "🔧"},
            {":nut_and_bolt:", "🔩"},
            {":hammer:", "🔨"},
            {":door:", "🚪"},
            {":smoking:", "🚬"},
            {":bomb:", "💣"},
            {":gun:", "🔫"},
            {":hocho:", "🔪"},
            {":knife:", "🔪"},
            {":pill:", "💊"},
            {":syringe:", "💉"},
            {":moneybag:", "💰"},
            {":yen:", "💴"},
            {":dollar:", "💵"},
            {":pound:", "💷"},
            {":euro:", "💶"},
            {":credit_card:", "💳"},
            {":money_with_wings:", "💸"},
            {":calling:", "📲"},
            {":e-mail:", "📧"},
            {":inbox_tray:", "📥"},
            {":outbox_tray:", "📤"},
            {":email:", "✉️"},
            {":envelope:", "✉️"},
            {":envelope_with_arrow:", "📩"},
            {":incoming_envelope:", "📨"},
            {":postal_horn:", "📯"},
            {":mailbox:", "📫"},
            {":mailbox_closed:", "📪"},
            {":mailbox_with_mail:", "📬"},
            {":mailbox_with_no_mail:", "📭"},
            {":postbox:", "📮"},
            {":package:", "📦"},
            {":memo:", "📝"},
            {":pencil:", "📝"},
            {":page_facing_up:", "📄"},
            {":page_with_curl:", "📃"},
            {":bookmark_tabs:", "📑"},
            {":bar_chart:", "📊"},
            {":chart_with_upwards_trend:", "📈"},
            {":chart_with_downwards_trend:", "📉"},
            {":scroll:", "📜"},
            {":clipboard:", "📋"},
            {":date:", "📅"},
            {":calendar:", "📆"},
            {":card_index:", "📇"},
            {":file_folder:", "📁"},
            {":open_file_folder:", "📂"},
            {":scissors:", "✂️"},
            {":pushpin:", "📌"},
            {":paperclip:", "📎"},
            {":black_nib:", "✒️"},
            {":pencil2:", "✏️"},
            {":straight_ruler:", "📏"},
            {":triangular_ruler:", "📐"},
            {":closed_book:", "📕"},
            {":green_book:", "📗"},
            {":blue_book:", "📘"},
            {":orange_book:", "📙"},
            {":notebook:", "📓"},
            {":notebook_with_decorative_cover:", "📔"},
            {":ledger:", "📒"},
            {":books:", "📚"},
            {":book:", "📖"},
            {":open_book:", "📖"},
            {":bookmark:", "🔖"},
            {":name_badge:", "📛"},
            {":microscope:", "🔬"},
            {":telescope:", "🔭"},
            {":newspaper:", "📰"},
            {":art:", "🎨"},
            {":clapper:", "🎬"},
            {":microphone:", "🎤"},
            {":headphones:", "🎧"},
            {":musical_score:", "🎼"},
            {":musical_note:", "🎵"},
            {":notes:", "🎶"},
            {":musical_keyboard:", "🎹"},
            {":violin:", "🎻"},
            {":trumpet:", "🎺"},
            {":saxophone:", "🎷"},
            {":guitar:", "🎸"},
            {":space_invader:", "👾"},
            {":video_game:", "🎮"},
            {":black_joker:", "🃏"},
            {":flower_playing_cards:", "🎴"},
            {":mahjong:", "🀄"},
            {":game_die:", "🎲"},
            {":dart:", "🎯"},
            {":football:", "🏈"},
            {":basketball:", "🏀"},
            {":soccer:", "⚽"},
            {":baseball:", "⚾️"},
            {":tennis:", "🎾"},
            {":8ball:", "🎱"},
            {":rugby_football:", "🏉"},
            {":bowling:", "🎳"},
            {":golf:", "⛳"},
            {":mountain_bicyclist:", "🚵"},
            {":bicyclist:", "🚴"},
            {":checkered_flag:", "🏁"},
            {":horse_racing:", "🏇"},
            {":trophy:", "🏆"},
            {":ski:", "🎿"},
            {":snowboarder:", "🏂"},
            {":swimmer:", "🏊"},
            {":surfer:", "🏄"},
            {":fishing_pole_and_fish:", "🎣"},
            {":coffee:", "☕"},
            {":tea:", "🍵"},
            {":sake:", "🍶"},
            {":baby_bottle:", "🍼"},
            {":beer:", "🍺"},
            {":beers:", "🍻"},
            {":cocktail:", "🍸"},
            {":tropical_drink:", "🍹"},
            {":wine_glass:", "🍷"},
            {":fork_and_knife:", "🍴"},
            {":pizza:", "🍕"},
            {":hamburger:", "🍔"},
            {":fries:", "🍟"},
            {":poultry_leg:", "🍗"},
            {":meat_on_bone:", "🍖"},
            {":spaghetti:", "🍝"},
            {":curry:", "🍛"},
            {":fried_shrimp:", "🍤"},
            {":bento:", "🍱"},
            {":sushi:", "🍣"},
            {":fish_cake:", "🍥"},
            {":rice_ball:", "🍙"},
            {":rice_cracker:", "🍘"},
            {":rice:", "🍚"},
            {":ramen:", "🍜"},
            {":stew:", "🍲"},
            {":oden:", "🍢"},
            {":dango:", "🍡"},
            {":egg:", "🍳"},
            {":bread:", "🍞"},
            {":doughnut:", "🍩"},
            {":custard:", "🍮"},
            {":icecream:", "🍦"},
            {":ice_cream:", "🍨"},
            {":shaved_ice:", "🍧"},
            {":birthday:", "🎂"},
            {":cake:", "🍰"},
            {":cookie:", "🍪"},
            {":chocolate_bar:", "🍫"},
            {":candy:", "🍬"},
            {":lollipop:", "🍭"},
            {":honey_pot:", "🍯"},
            {":apple:", "🍎"},
            {":green_apple:", "🍏"},
            {":tangerine:", "🍊"},
            {":lemon:", "🍋"},
            {":cherries:", "🍒"},
            {":grapes:", "🍇"},
            {":watermelon:", "🍉"},
            {":strawberry:", "🍓"},
            {":peach:", "🍑"},
            {":melon:", "🍈"},
            {":banana:", "🍌"},
            {":pear:", "🍐"},
            {":pineapple:", "🍍"},
            {":sweet_potato:", "🍠"},
            {":eggplant:", "🍆"},
            {":tomato:", "🍅"},
            {":corn:", "🌽"},
            {":house:", "🏠"},
            {":house_with_garden:", "🏡"},
            {":school:", "🏫"},
            {":office:", "🏢"},
            {":post_office:", "🏣"},
            {":hospital:", "🏥"},
            {":bank:", "🏦"},
            {":convenience_store:", "🏪"},
            {":love_hotel:", "🏩"},
            {":hotel:", "🏨"},
            {":wedding:", "💒"},
            {":church:", "⛪"},
            {":department_store:", "🏬"},
            {":european_post_office:", "🏤"},
            {":city_sunrise:", "🌇"},
            {":city_sunset:", "🌆"},
            {":japanese_castle:", "🏯"},
            {":european_castle:", "🏰"},
            {":tent:", "⛺"},
            {":factory:", "🏭"},
            {":tokyo_tower:", "🗼"},
            {":japan:", "🗾"},
            {":mount_fuji:", "🗻"},
            {":sunrise_over_mountains:", "🌄"},
            {":sunrise:", "🌅"},
            {":night_with_stars:", "🌃"},
            {":statue_of_liberty:", "🗽"},
            {":bridge_at_night:", "🌉"},
            {":carousel_horse:", "🎠"},
            {":ferris_wheel:", "🎡"},
            {":fountain:", "⛲"},
            {":roller_coaster:", "🎢"},
            {":ship:", "🚢"},
            {":boat:", "⛵"},
            {":sailboat:", "⛵"},
            {":speedboat:", "🚤"},
            {":rowboat:", "🚣"},
            {":anchor:", "⚓"},
            {":rocket:", "🚀"},
            {":airplane:", "✈️"},
            {":seat:", "💺"},
            {":helicopter:", "🚁"},
            {":steam_locomotive:", "🚂"},
            {":tram:", "🚊"},
            {":station:", "🚉"},
            {":mountain_railway:", "🚞"},
            {":train2:", "🚆"},
            {":bullettrain_side:", "🚄"},
            {":bullettrain_front:", "🚅"},
            {":light_rail:", "🚈"},
            {":metro:", "🚇"},
            {":monorail:", "🚝"},
            {":train:", "🚋"},
            {":railway_car:", "🚃"},
            {":trolleybus:", "🚎"},
            {":bus:", "🚌"},
            {":oncoming_bus:", "🚍"},
            {":blue_car:", "🚙"},
            {":oncoming_automobile:", "🚘"},
            {":car:", "🚗"},
            {":red_car:", "🚗"},
            {":taxi:", "🚕"},
            {":oncoming_taxi:", "🚖"},
            {":articulated_lorry:", "🚛"},
            {":truck:", "🚚"},
            {":rotating_light:", "🚨"},
            {":police_car:", "🚓"},
            {":oncoming_police_car:", "🚔"},
            {":fire_engine:", "🚒"},
            {":ambulance:", "🚑"},
            {":minibus:", "🚐"},
            {":bike:", "🚲"},
            {":aerial_tramway:", "🚡"},
            {":suspension_railway:", "🚟"},
            {":mountain_cableway:", "🚠"},
            {":tractor:", "🚜"},
            {":barber:", "💈"},
            {":busstop:", "🚏"},
            {":ticket:", "🎫"},
            {":vertical_traffic_light:", "🚦"},
            {":traffic_light:", "🚥"},
            {":warning:", "⚠️"},
            {":construction:", "🚧"},
            {":beginner:", "🔰"},
            {":fuelpump:", "⛽"},
            {":izakaya_lantern:", "🏮"},
            {":lantern:", "🏮"},
            {":slot_machine:", "🎰"},
            {":hotsprings:", "♨️"},
            {":moyai:", "🗿"},
            {":circus_tent:", "🎪"},
            {":performing_arts:", "🎭"},
            {":round_pushpin:", "📍"},
            {":triangular_flag_on_post:", "🚩"},
            {":jp:", "🇯🇵"},
            {":kr:", "🇰🇷"},
            {":de:", "🇩🇪"},
            {":cn:", "🇨🇳"},
            {":us:", "🇺🇸"},
            {":fr:", "🇫🇷"},
            {":es:", "🇪🇸"},
            {":it:", "🇮🇹"},
            {":ru:", "🇷🇺"},
            {":gb:", "🇬🇧"},
            {":uk:", "🇬🇧"},
            {":one:", "1️⃣"},
            {":two:", "2️⃣"},
            {":three:", "3️⃣"},
            {":four:", "4️⃣"},
            {":five:", "5️⃣"},
            {":six:", "6️⃣"},
            {":seven:", "7️⃣"},
            {":eight:", "8️⃣"},
            {":nine:", "9️⃣"},
            {":zero:", "0️⃣"},
            {":keycap_ten:", "🔟"},
            {":hash:", "#️⃣"},
            {":symbols:", "🔣"},
            {":arrow_up:", "⬆️"},
            {":arrow_down:", "⬇️"},
            {":arrow_left:", "⬅️"},
            {":arrow_right:", "➡️"},
            {":capital_abcd:", "🔠"},
            {":abcd:", "🔡"},
            {":abc:", "🔤"},
            {":arrow_upper_right:", "↗️"},
            {":arrow_upper_left:", "↖️"},
            {":arrow_lower_right:", "↘️"},
            {":arrow_lower_left:", "↙️"},
            {":left_right_arrow:", "↔️"},
            {":arrow_up_down:", "↕️"},
            {":arrows_counterclockwise:", "🔄"},
            {":arrow_backward:", "◀️"},
            {":arrow_forward:", "▶️"},
            {":arrow_up_small:", "🔼"},
            {":arrow_down_small:", "🔽"},
            {":leftwards_arrow_with_hook:", "↩️"},
            {":arrow_right_hook:", "↪️"},
            {":information_source:", "ℹ️"},
            {":rewind:", "⏪"},
            {":fast_forward:", "⏩"},
            {":arrow_double_up:", "⏫"},
            {":arrow_double_down:", "⏬"},
            {":arrow_heading_down:", "⤵️"},
            {":arrow_heading_up:", "⤴️"},
            {":ok:", "🆗"},
            {":twisted_rightwards_arrows:", "🔀"},
            {":repeat:", "🔁"},
            {":repeat_one:", "🔂"},
            {":new:", "🆕"},
            {":up:", "🆙"},
            {":cool:", "🆒"},
            {":free:", "🆓"},
            {":ng:", "🆖"},
            {":signal_strength:", "📶"},
            {":cinema:", "🎦"},
            {":koko:", "🈁"},
            {":u6307:", "🈯"},
            {":u7a7a:", "🈳"},
            {":u6e80:", "🈵"},
            {":u5408:", "🈴"},
            {":u7981:", "🈲"},
            {":ideograph_advantage:", "🉐"},
            {":u5272:", "🈹"},
            {":u55b6:", "🈺"},
            {":u6709:", "🈶"},
            {":u7121:", "🈚"},
            {":restroom:", "🚻"},
            {":mens:", "🚹"},
            {":womens:", "🚺"},
            {":baby_symbol:", "🚼"},
            {":wc:", "🚾"},
            {":potable_water:", "🚰"},
            {":put_litter_in_its_place:", "🚮"},
            {":parking:", "🅿️"},
            {":wheelchair:", "♿"},
            {":no_smoking:", "🚭"},
            {":u6708:", "🈷️"},
            {":u7533:", "🈸"},
            {":sa:", "🈂️"},
            {":m:", "Ⓜ️"},
            {":passport_control:", "🛂"},
            {":baggage_claim:", "🛄"},
            {":left_luggage:", "🛅"},
            {":customs:", "🛃"},
            {":accept:", "🉑"},
            {":secret:", "㊙️"},
            {":congratulations:", "㊗️"},
            {":cl:", "🆑"},
            {":sos:", "🆘"},
            {":id:", "🆔"},
            {":no_entry_sign:", "🚫"},
            {":underage:", "🔞"},
            {":no_mobile_phones:", "📵"},
            {":do_not_litter:", "🚯"},
            {":non-potable_water:", "🚱"},
            {":no_bicycles:", "🚳"},
            {":no_pedestrians:", "🚷"},
            {":children_crossing:", "🚸"},
            {":no_entry:", "⛔"},
            {":eight_spoked_asterisk:", "✳️"},
            {":sparkle:", "❇️"},
            {":negative_squared_cross_mark:", "❎"},
            {":white_check_mark:", "✅"},
            {":eight_pointed_black_star:", "✴️"},
            {":heart_decoration:", "💟"},
            {":vs:", "🆚"},
            {":vibration_mode:", "📳"},
            {":mobile_phone_off:", "📴"},
            {":a:", "🅰️"},
            {":b:", "🅱️"},
            {":ab:", "🆎"},
            {":o2:", "🅾️"},
            {":diamond_shape_with_a_dot_inside:", "💠"},
            {":loop:", "➿"},
            {":recycle:", "♻️"},
            {":aries:", "♈"},
            {":taurus:", "♉"},
            {":gemini:", "♊"},
            {":cancer:", "♋"},
            {":leo:", "♌"},
            {":virgo:", "♍"},
            {":libra:", "♎"},
            {":scorpius:", "♏"},
            {":sagittarius:", "♐"},
            {":capricorn:", "♑"},
            {":aquarius:", "♒"},
            {":pisces:", "♓"},
            {":ophiuchus:", "⛎"},
            {":six_pointed_star:", "🔯"},
            {":atm:", "🏧"},
            {":chart:", "💹"},
            {":heavy_dollar_sign:", "💲"},
            {":currency_exchange:", "💱"},
            {":copyright:", "©️"},
            {":registered:", "®️"},
            {":tm:", "™️"},
            {":x:", "❌"},
            {":bangbang:", "‼️"},
            {":interrobang:", "⁉️"},
            {":exclamation:", "❗"},
            {":heavy_exclamation_mark:", "❗"},
            {":question:", "❓"},
            {":grey_exclamation:", "❕"},
            {":grey_question:", "❔"},
            {":o:", "⭕"},
            {":top:", "🔝"},
            {":end:", "🔚"},
            {":back:", "🔙"},
            {":on:", "🔛"},
            {":soon:", "🔜"},
            {":arrows_clockwise:", "🔃"},
            {":clock12:", "🕛"},
            {":clock1230:", "🕧"},
            {":clock1:", "🕐"},
            {":clock130:", "🕜"},
            {":clock2:", "🕑"},
            {":clock230:", "🕝"},
            {":clock3:", "🕒"},
            {":clock330:", "🕞"},
            {":clock4:", "🕓"},
            {":clock430:", "🕟"},
            {":clock5:", "🕔"},
            {":clock530:", "🕠"},
            {":clock6:", "🕕"},
            {":clock7:", "🕖"},
            {":clock8:", "🕗"},
            {":clock9:", "🕘"},
            {":clock10:", "🕙"},
            {":clock11:", "🕚"},
            {":clock630:", "🕡"},
            {":clock730:", "🕢"},
            {":clock830:", "🕣"},
            {":clock930:", "🕤"},
            {":clock1030:", "🕥"},
            {":clock1130:", "🕦"},
            {":heavy_multiplication_x:", "✖️"},
            {":heavy_plus_sign:", "➕"},
            {":heavy_minus_sign:", "➖"},
            {":heavy_division_sign:", "➗"},
            {":spades:", "♠️"},
            {":hearts:", "♥️"},
            {":clubs:", "♣️"},
            {":diamonds:", "♦️"},
            {":white_flower:", "💮"},
            {":heavy_check_mark:", "✔️"},
            {":ballot_box_with_check:", "☑️"},
            {":radio_button:", "🔘"},
            {":link:", "🔗"},
            {":curly_loop:", "➰"},
            {":wavy_dash:", "〰️"},
            {":part_alternation_mark:", "〽️"},
            {":trident:", "🔱"},
            {":black_medium_square:", "◼️"},
            {":white_medium_square:", "◻️"},
            {":black_medium_small_square:", "◾"},
            {":white_medium_small_square:", "◽"},
            {":black_small_square:", "▪️"},
            {":white_small_square:", "▫️"},
            {":small_red_triangle:", "🔺"},
            {":black_square_button:", "🔲"},
            {":white_square_button:", "🔳"},
            {":black_circle:", "⚫"},
            {":white_circle:", "⚪"},
            {":red_circle:", "🔴"},
            {":large_blue_circle:", "🔵"},
            {":small_red_triangle_down:", "🔻"},
            {":white_large_square:", "⬜"},
            {":black_large_square:", "⬛"},
            {":large_orange_diamond:", "🔶"},
            {":large_blue_diamond:", "🔷"},
            {":small_orange_diamond:", "🔸"},
            {":small_blue_diamond:", "🔹"},

            // Custom additions
            { ":custom_arrow_left:", "←"},
            { ":custom_arrow_right:", "→"},
            { ":custom_arrow_left_right:", "↔"},

            { ":custom_arrow_left_strong:", "⇐"},
            { ":custom_arrow_right_strong:", "⇒"},
            { ":custom_arrow_left_right_strong:", "⇔"},
            {":rofl:","🤣"},
            {":slightly_smiling_face:","🙂"},
            {":upside_down_face:","🙃"},
            {":star_struck:","🤩"},
            {":zany_face:","🤪"},
            {":money_mouth_face:","🤑"},
            {":hugs:","🤗"},
            {":hand_over_mouth:","🤭"},
            {":shushing_face:","🤫"},
            {":thinking:","🤔"},
            {":zipper_mouth_face:","🤐"},
            {":raised_eyebrow:","🤨"},
            {":roll_eyes:","🙄"},
            {":lying_face:","🤥"},
            {":drooling_face:","🤤"},
            {":face_with_thermometer:","🤒"},
            {":face_with_head_bandage:","🤕"},
            {":nauseated_face:","🤢"},
            {":vomiting_face:","🤮"},
            {":sneezing_face:","🤧"},
            {":exploding_head:","🤯"},
            {":cowboy_hat_face:","🤠"},
            {":nerd_face:","🤓"},
            {":monocle_face:","🧐"},
            {":slightly_frowning_face:","🙁"},
            {":frowning_face:","☹️"},
            {":cursing_face:","🤬"},
            {":skull_and_crossbones:","☠️"},
            {":clown_face:","🤡"},
            {":robot:","🤖"},
            {":heavy_heart_exclamation:","❣️"},
            {":orange_heart:","🧡"},
            {":black_heart:","🖤"},
            {":hole:","🕳️"},
            {":eye_speech_bubble:","👁️‍🗨️"},
            {":left_speech_bubble:","🗨️"},
            {":right_anger_bubble:","🗯️"},
            {":raised_back_of_hand:","🤚"},
            {":raised_hand_with_fingers_splayed:","🖐️"},
            {":vulcan_salute:","🖖"},
            {":crossed_fingers:","🤞"},
            {":love_you_gesture:","🤟"},
            {":metal:","🤘"},
            {":call_me_hand:","🤙"},
            {":middle_finger:","🖕"},
            {":fist_raised:","✊"},
            {":fist_oncoming:","👊"},
            {":fist_left:","🤛"},
            {":fist_right:","🤜"},
            {":palms_up_together:","🤲"},
            {":handshake:","🤝"},
            {":writing_hand:","✍️"},
            {":selfie:","🤳"},
            {":brain:","🧠"},
            {":eye:","👁️"},
            {":child:","🧒"},
            {":adult:","🧑"},
            {":blond_haired_person:","👱"},
            {":bearded_person:","🧔"},
            {":blond_haired_man:","👱‍♂️"},
            {":blond_haired_woman:","👱‍♀️"},
            {":older_adult:","🧓"},
            {":frowning_person:","🙍"},
            {":frowning_man:","🙍‍♂️"},
            {":frowning_woman:","🙍‍♀️"},
            {":pouting_face:","🙎"},
            {":pouting_man:","🙎‍♂️"},
            {":pouting_woman:","🙎‍♀️"},
            {":no_good_man:","🙅‍♂️"},
            {":no_good_woman:","🙅‍♀️"},
            {":ok_person:","🙆"},
            {":ok_man:","🙆‍♂️"},
            {":tipping_hand_person:","💁"},
            {":tipping_hand_man:","💁‍♂️"},
            {":tipping_hand_woman:","💁‍♀️"},
            {":raising_hand_man:","🙋‍♂️"},
            {":raising_hand_woman:","🙋‍♀️"},
            {":bowing_man:","🙇‍♂️"},
            {":bowing_woman:","🙇‍♀️"},
            {":facepalm:","🤦"},
            {":man_facepalming:","🤦‍♂️"},
            {":woman_facepalming:","🤦‍♀️"},
            {":shrug:","🤷"},
            {":man_shrugging:","🤷‍♂️"},
            {":woman_shrugging:","🤷‍♀️"},
            {":man_health_worker:","👨‍⚕️"},
            {":woman_health_worker:","👩‍⚕️"},
            {":man_student:","👨‍🎓"},
            {":woman_student:","👩‍🎓"},
            {":man_teacher:","👨‍🏫"},
            {":woman_teacher:","👩‍🏫"},
            {":man_judge:","👨‍⚖️"},
            {":woman_judge:","👩‍⚖️"},
            {":man_farmer:","👨‍🌾"},
            {":woman_farmer:","👩‍🌾"},
            {":man_cook:","👨‍🍳"},
            {":woman_cook:","👩‍🍳"},
            {":man_mechanic:","👨‍🔧"},
            {":woman_mechanic:","👩‍🔧"},
            {":man_factory_worker:","👨‍🏭"},
            {":woman_factory_worker:","👩‍🏭"},
            {":man_office_worker:","👨‍💼"},
            {":woman_office_worker:","👩‍💼"},
            {":man_scientist:","👨‍🔬"},
            {":woman_scientist:","👩‍🔬"},
            {":man_technologist:","👨‍💻"},
            {":woman_technologist:","👩‍💻"},
            {":man_singer:","👨‍🎤"},
            {":woman_singer:","👩‍🎤"},
            {":man_artist:","👨‍🎨"},
            {":woman_artist:","👩‍🎨"},
            {":man_pilot:","👨‍✈️"},
            {":woman_pilot:","👩‍✈️"},
            {":man_astronaut:","👨‍🚀"},
            {":woman_astronaut:","👩‍🚀"},
            {":man_firefighter:","👨‍🚒"},
            {":woman_firefighter:","👩‍🚒"},
            {":police_officer:","👮"},
            {":policeman:","👮‍♂️"},
            {":policewoman:","👮‍♀️"},
            {":detective:","🕵️"},
            {":male_detective:","🕵️‍♂️"},
            {":female_detective:","🕵️‍♀️"},
            {":guard:","💂"},
            {":guardswoman:","💂‍♀️"},
            {":construction_worker_man:","👷‍♂️"},
            {":construction_worker_woman:","👷‍♀️"},
            {":prince:","🤴"},
            {":person_with_turban:","👳"},
            {":woman_with_turban:","👳‍♀️"},
            {":woman_with_headscarf:","🧕"},
            {":man_in_tuxedo:","🤵"},
            {":pregnant_woman:","🤰"},
            {":breast_feeding:","🤱"},
            {":mrs_claus:","🤶"},
            {":mage:","🧙"},
            {":mage_man:","🧙‍♂️"},
            {":mage_woman:","🧙‍♀️"},
            {":fairy:","🧚"},
            {":fairy_man:","🧚‍♂️"},
            {":fairy_woman:","🧚‍♀️"},
            {":vampire:","🧛"},
            {":vampire_man:","🧛‍♂️"},
            {":vampire_woman:","🧛‍♀️"},
            {":merperson:","🧜"},
            {":merman:","🧜‍♂️"},
            {":mermaid:","🧜‍♀️"},
            {":elf:","🧝"},
            {":elf_man:","🧝‍♂️"},
            {":elf_woman:","🧝‍♀️"},
            {":genie:","🧞"},
            {":genie_man:","🧞‍♂️"},
            {":genie_woman:","🧞‍♀️"},
            {":zombie:","🧟"},
            {":zombie_man:","🧟‍♂️"},
            {":zombie_woman:","🧟‍♀️"},
            {":massage_man:","💆‍♂️"},
            {":massage_woman:","💆‍♀️"},
            {":haircut_man:","💇‍♂️"},
            {":haircut_woman:","💇‍♀️"},
            {":walking_man:","🚶‍♂️"},
            {":walking_woman:","🚶‍♀️"},
            {":running_man:","🏃‍♂️"},
            {":running_woman:","🏃‍♀️"},
            {":woman_dancing:","💃"},
            {":man_dancing:","🕺"},
            {":business_suit_levitating:","🕴️"},
            {":dancing_men:","👯‍♂️"},
            {":dancing_women:","👯‍♀️"},
            {":sauna_person:","🧖"},
            {":sauna_man:","🧖‍♂️"},
            {":sauna_woman:","🧖‍♀️"},
            {":climbing:","🧗"},
            {":climbing_man:","🧗‍♂️"},
            {":climbing_woman:","🧗‍♀️"},
            {":person_fencing:","🤺"},
            {":skier:","⛷️"},
            {":golfing:","🏌️"},
            {":golfing_man:","🏌️‍♂️"},
            {":golfing_woman:","🏌️‍♀️"},
            {":surfing_man:","🏄‍♂️"},
            {":surfing_woman:","🏄‍♀️"},
            {":rowing_man:","🚣‍♂️"},
            {":rowing_woman:","🚣‍♀️"},
            {":swimming_man:","🏊‍♂️"},
            {":swimming_woman:","🏊‍♀️"},
            {":bouncing_ball_person:","⛹️"},
            {":bouncing_ball_man:","⛹️‍♂️"},
            {":bouncing_ball_woman:","⛹️‍♀️"},
            {":weight_lifting:","🏋️"},
            {":weight_lifting_man:","🏋️‍♂️"},
            {":weight_lifting_woman:","🏋️‍♀️"},
            {":biking_man:","🚴‍♂️"},
            {":biking_woman:","🚴‍♀️"},
            {":mountain_biking_man:","🚵‍♂️"},
            {":mountain_biking_woman:","🚵‍♀️"},
            {":cartwheeling:","🤸"},
            {":man_cartwheeling:","🤸‍♂️"},
            {":woman_cartwheeling:","🤸‍♀️"},
            {":wrestling:","🤼"},
            {":men_wrestling:","🤼‍♂️"},
            {":women_wrestling:","🤼‍♀️"},
            {":water_polo:","🤽"},
            {":man_playing_water_polo:","🤽‍♂️"},
            {":woman_playing_water_polo:","🤽‍♀️"},
            {":handball_person:","🤾"},
            {":man_playing_handball:","🤾‍♂️"},
            {":woman_playing_handball:","🤾‍♀️"},
            {":juggling_person:","🤹"},
            {":man_juggling:","🤹‍♂️"},
            {":woman_juggling:","🤹‍♀️"},
            {":lotus_position:","🧘"},
            {":lotus_position_man:","🧘‍♂️"},
            {":lotus_position_woman:","🧘‍♀️"},
            {":sleeping_bed:","🛌"},
            {":people_holding_hands:","🧑‍🤝‍🧑"},
            {":couplekiss_man_woman:","👩‍❤️‍💋‍👨"},
            {":couplekiss_man_man:","👨‍❤️‍💋‍👨"},
            {":couplekiss_woman_woman:","👩‍❤️‍💋‍👩"},
            {":couple_with_heart_woman_man:","👩‍❤️‍👨"},
            {":couple_with_heart_man_man:","👨‍❤️‍👨"},
            {":couple_with_heart_woman_woman:","👩‍❤️‍👩"},
            {":family_man_woman_boy:","👨‍👩‍👦"},
            {":family_man_woman_girl:","👨‍👩‍👧"},
            {":family_man_woman_girl_boy:","👨‍👩‍👧‍👦"},
            {":family_man_woman_boy_boy:","👨‍👩‍👦‍👦"},
            {":family_man_woman_girl_girl:","👨‍👩‍👧‍👧"},
            {":family_man_man_boy:","👨‍👨‍👦"},
            {":family_man_man_girl:","👨‍👨‍👧"},
            {":family_man_man_girl_boy:","👨‍👨‍👧‍👦"},
            {":family_man_man_boy_boy:","👨‍👨‍👦‍👦"},
            {":family_man_man_girl_girl:","👨‍👨‍👧‍👧"},
            {":family_woman_woman_boy:","👩‍👩‍👦"},
            {":family_woman_woman_girl:","👩‍👩‍👧"},
            {":family_woman_woman_girl_boy:","👩‍👩‍👧‍👦"},
            {":family_woman_woman_boy_boy:","👩‍👩‍👦‍👦"},
            {":family_woman_woman_girl_girl:","👩‍👩‍👧‍👧"},
            {":family_man_boy:","👨‍👦"},
            {":family_man_boy_boy:","👨‍👦‍👦"},
            {":family_man_girl:","👨‍👧"},
            {":family_man_girl_boy:","👨‍👧‍👦"},
            {":family_man_girl_girl:","👨‍👧‍👧"},
            {":family_woman_boy:","👩‍👦"},
            {":family_woman_boy_boy:","👩‍👦‍👦"},
            {":family_woman_girl:","👩‍👧"},
            {":family_woman_girl_boy:","👩‍👧‍👦"},
            {":family_woman_girl_girl:","👩‍👧‍👧"},
            {":speaking_head:","🗣️"},
            {":gorilla:","🦍"},
            {":fox_face:","🦊"},
            {":lion:","🦁"},
            {":unicorn:","🦄"},
            {":zebra:","🦓"},
            {":deer:","🦌"},
            {":giraffe:","🦒"},
            {":rhinoceros:","🦏"},
            {":chipmunk:","🐿️"},
            {":hedgehog:","🦔"},
            {":bat:","🦇"},
            {":turkey:","🦃"},
            {":dove:","🕊️"},
            {":eagle:","🦅"},
            {":duck:","🦆"},
            {":owl:","🦉"},
            {":lizard:","🦎"},
            {":sauropod:","🦕"},
            {":t-rex:","🦖"},
            {":shark:","🦈"},
            {":butterfly:","🦋"},
            {":cricket:","🦗"},
            {":spider:","🕷️"},
            {":spider_web:","🕸️"},
            {":scorpion:","🦂"},
            {":rosette:","🏵️"},
            {":wilted_flower:","🥀"},
            {":shamrock:","☘️"},
            {":kiwi_fruit:","🥝"},
            {":coconut:","🥥"},
            {":avocado:","🥑"},
            {":potato:","🥔"},
            {":carrot:","🥕"},
            {":hot_pepper:","🌶️"},
            {":cucumber:","🥒"},
            {":broccoli:","🥦"},
            {":peanuts:","🥜"},
            {":croissant:","🥐"},
            {":baguette_bread:","🥖"},
            {":pretzel:","🥨"},
            {":pancakes:","🥞"},
            {":cheese:","🧀"},
            {":cut_of_meat:","🥩"},
            {":bacon:","🥓"},
            {":hotdog:","🌭"},
            {":sandwich:","🥪"},
            {":taco:","🌮"},
            {":burrito:","🌯"},
            {":stuffed_flatbread:","🥙"},
            {":fried_egg:","🍳"},
            {":shallow_pan_of_food:","🥘"},
            {":bowl_with_spoon:","🥣"},
            {":green_salad:","🥗"},
            {":popcorn:","🍿"},
            {":canned_food:","🥫"},
            {":dumpling:","🥟"},
            {":fortune_cookie:","🥠"},
            {":takeout_box:","🥡"},
            {":crab:","🦀"},
            {":shrimp:","🦐"},
            {":squid:","🦑"},
            {":pie:","🥧"},
            {":milk_glass:","🥛"},
            {":champagne:","🍾"},
            {":clinking_glasses:","🥂"},
            {":tumbler_glass:","🥃"},
            {":cup_with_straw:","🥤"},
            {":chopsticks:","🥢"},
            {":plate_with_cutlery:","🍽️"},
            {":spoon:","🥄"},
            {":amphora:","🏺"},
            {":world_map:","🗺️"},
            {":mountain_snow:","🏔️"},
            {":mountain:","⛰️"},
            {":camping:","🏕️"},
            {":beach_umbrella:","🏖️"},
            {":desert:","🏜️"},
            {":desert_island:","🏝️"},
            {":national_park:","🏞️"},
            {":stadium:","🏟️"},
            {":classical_building:","🏛️"},
            {":building_construction:","🏗️"},
            {":houses:","🏘️"},
            {":derelict_house:","🏚️"},
            {":mosque:","🕌"},
            {":synagogue:","🕍"},
            {":shinto_shrine:","⛩️"},
            {":kaaba:","🕋"},
            {":cityscape:","🏙️"},
            {":racing_car:","🏎️"},
            {":motorcycle:","🏍️"},
            {":motor_scooter:","🛵"},
            {":kick_scooter:","🛴"},
            {":motorway:","🛣️"},
            {":railway_track:","🛤️"},
            {":oil_drum:","🛢️"},
            {":stop_sign:","🛑"},
            {":canoe:","🛶"},
            {":passenger_ship:","🛳️"},
            {":ferry:","⛴️"},
            {":motor_boat:","🛥️"},
            {":small_airplane:","🛩️"},
            {":flight_departure:","🛫"},
            {":flight_arrival:","🛬"},
            {":artificial_satellite:","🛰️"},
            {":flying_saucer:","🛸"},
            {":bellhop_bell:","🛎️"},
            {":stopwatch:","⏱️"},
            {":timer_clock:","⏲️"},
            {":mantelpiece_clock:","🕰️"},
            {":thermometer:","🌡️"},
            {":cloud_with_lightning_and_rain:","⛈️"},
            {":sun_behind_small_cloud:","🌤️"},
            {":sun_behind_large_cloud:","🌥️"},
            {":sun_behind_rain_cloud:","🌦️"},
            {":cloud_with_rain:","🌧️"},
            {":cloud_with_snow:","🌨️"},
            {":cloud_with_lightning:","🌩️"},
            {":tornado:","🌪️"},
            {":fog:","🌫️"},
            {":wind_face:","🌬️"},
            {":open_umbrella:","☂️"},
            {":parasol_on_ground:","⛱️"},
            {":snowman_with_snow:","☃️"},
            {":comet:","☄️"},
            {":reminder_ribbon:","🎗️"},
            {":tickets:","🎟️"},
            {":medal_military:","🎖️"},
            {":medal_sports:","🏅"},
            {":1st_place_medal:","🥇"},
            {":2nd_place_medal:","🥈"},
            {":3rd_place_medal:","🥉"},
            {":volleyball:","🏐"},
            {":cricket_game:","🏏"},
            {":field_hockey:","🏑"},
            {":ice_hockey:","🏒"},
            {":ping_pong:","🏓"},
            {":badminton:","🏸"},
            {":boxing_glove:","🥊"},
            {":martial_arts_uniform:","🥋"},
            {":goal_net:","🥅"},
            {":ice_skate:","⛸️"},
            {":sled:","🛷"},
            {":curling_stone:","🥌"},
            {":joystick:","🕹️"},
            {":chess_pawn:","♟️"},
            {":framed_picture:","🖼️"},
            {":dark_sunglasses:","🕶️"},
            {":scarf:","🧣"},
            {":gloves:","🧤"},
            {":coat:","🧥"},
            {":socks:","🧦"},
            {":shopping:","🛍️"},
            {":billed_cap:","🧢"},
            {":rescue_worker_helmet:","⛑️"},
            {":prayer_beads:","📿"},
            {":studio_microphone:","🎙️"},
            {":level_slider:","🎚️"},
            {":control_knobs:","🎛️"},
            {":drum:","🥁"},
            {":desktop_computer:","🖥️"},
            {":printer:","🖨️"},
            {":keyboard:","⌨️"},
            {":computer_mouse:","🖱️"},
            {":trackball:","🖲️"},
            {":film_strip:","🎞️"},
            {":film_projector:","📽️"},
            {":camera_flash:","📸"},
            {":candle:","🕯️"},
            {":newspaper_roll:","🗞️"},
            {":label:","🏷️"},
            {":ballot_box:","🗳️"},
            {":fountain_pen:","🖋️"},
            {":pen:","🖊️"},
            {":paintbrush:","🖌️"},
            {":crayon:","🖍️"},
            {":card_index_dividers:","🗂️"},
            {":spiral_notepad:","🗒️"},
            {":spiral_calendar:","🗓️"},
            {":paperclips:","🖇️"},
            {":card_file_box:","🗃️"},
            {":file_cabinet:","🗄️"},
            {":wastebasket:","🗑️"},
            {":old_key:","🗝️"},
            {":pick:","⛏️"},
            {":hammer_and_pick:","⚒️"},
            {":hammer_and_wrench:","🛠️"},
            {":dagger:","🗡️"},
            {":crossed_swords:","⚔️"},
            {":bow_and_arrow:","🏹"},
            {":shield:","🛡️"},
            {":gear:","⚙️"},
            {":clamp:","🗜️"},
            {":balance_scale:","⚖️"},
            {":chains:","⛓️"},
            {":alembic:","⚗️"},
            {":bed:","🛏️"},
            {":couch_and_lamp:","🛋️"},
            {":shopping_cart:","🛒"},
            {":coffin:","⚰️"},
            {":funeral_urn:","⚱️"},
            {":radioactive:","☢️"},
            {":biohazard:","☣️"},
            {":place_of_worship:","🛐"},
            {":atom_symbol:","⚛️"},
            {":om:","🕉️"},
            {":star_of_david:","✡️"},
            {":wheel_of_dharma:","☸️"},
            {":yin_yang:","☯️"},
            {":latin_cross:","✝️"},
            {":orthodox_cross:","☦️"},
            {":star_and_crescent:","☪️"},
            {":peace_symbol:","☮️"},
            {":menorah:","🕎"},
            {":next_track_button:","⏭️"},
            {":play_or_pause_button:","⏯️"},
            {":previous_track_button:","⏮️"},
            {":pause_button:","⏸️"},
            {":stop_button:","⏹️"},
            {":record_button:","⏺️"},
            {":eject_button:","⏏️"},
            {":female_sign:","♀️"},
            {":male_sign:","♂️"},
            {":medical_symbol:","⚕️"},
            {":infinity:","♾️"},
            {":fleur_de_lis:","⚜️"},
            {":asterisk:","*️⃣"},
            {":black_flag:","🏴"},
            {":white_flag:","🏳️"},
            {":rainbow_flag:","🏳️‍🌈"},
            {":pirate_flag:","🏴‍☠️"},
            {":ascension_island:","🇦🇨"},
            {":andorra:","🇦🇩"},
            {":united_arab_emirates:","🇦🇪"},
            {":afghanistan:","🇦🇫"},
            {":antigua_barbuda:","🇦🇬"},
            {":anguilla:","🇦🇮"},
            {":albania:","🇦🇱"},
            {":armenia:","🇦🇲"},
            {":angola:","🇦🇴"},
            {":antarctica:","🇦🇶"},
            {":argentina:","🇦🇷"},
            {":american_samoa:","🇦🇸"},
            {":austria:","🇦🇹"},
            {":australia:","🇦🇺"},
            {":aruba:","🇦🇼"},
            {":aland_islands:","🇦🇽"},
            {":azerbaijan:","🇦🇿"},
            {":bosnia_herzegovina:","🇧🇦"},
            {":barbados:","🇧🇧"},
            {":bangladesh:","🇧🇩"},
            {":belgium:","🇧🇪"},
            {":burkina_faso:","🇧🇫"},
            {":bulgaria:","🇧🇬"},
            {":bahrain:","🇧🇭"},
            {":burundi:","🇧🇮"},
            {":benin:","🇧🇯"},
            {":st_barthelemy:","🇧🇱"},
            {":bermuda:","🇧🇲"},
            {":brunei:","🇧🇳"},
            {":bolivia:","🇧🇴"},
            {":caribbean_netherlands:","🇧🇶"},
            {":brazil:","🇧🇷"},
            {":bahamas:","🇧🇸"},
            {":bhutan:","🇧🇹"},
            {":bouvet_island:","🇧🇻"},
            {":botswana:","🇧🇼"},
            {":belarus:","🇧🇾"},
            {":belize:","🇧🇿"},
            {":canada:","🇨🇦"},
            {":cocos_islands:","🇨🇨"},
            {":congo_kinshasa:","🇨🇩"},
            {":central_african_republic:","🇨🇫"},
            {":congo_brazzaville:","🇨🇬"},
            {":switzerland:","🇨🇭"},
            {":cote_divoire:","🇨🇮"},
            {":cook_islands:","🇨🇰"},
            {":chile:","🇨🇱"},
            {":cameroon:","🇨🇲"},
            {":colombia:","🇨🇴"},
            {":clipperton_island:","🇨🇵"},
            {":costa_rica:","🇨🇷"},
            {":cuba:","🇨🇺"},
            {":cape_verde:","🇨🇻"},
            {":curacao:","🇨🇼"},
            {":christmas_island:","🇨🇽"},
            {":cyprus:","🇨🇾"},
            {":czech_republic:","🇨🇿"},
            {":diego_garcia:","🇩🇬"},
            {":djibouti:","🇩🇯"},
            {":denmark:","🇩🇰"},
            {":dominica:","🇩🇲"},
            {":dominican_republic:","🇩🇴"},
            {":algeria:","🇩🇿"},
            {":ceuta_melilla:","🇪🇦"},
            {":ecuador:","🇪🇨"},
            {":estonia:","🇪🇪"},
            {":egypt:","🇪🇬"},
            {":western_sahara:","🇪🇭"},
            {":eritrea:","🇪🇷"},
            {":ethiopia:","🇪🇹"},
            {":eu:","🇪🇺"},
            {":finland:","🇫🇮"},
            {":fiji:","🇫🇯"},
            {":falkland_islands:","🇫🇰"},
            {":micronesia:","🇫🇲"},
            {":faroe_islands:","🇫🇴"},
            {":gabon:","🇬🇦"},
            {":grenada:","🇬🇩"},
            {":georgia:","🇬🇪"},
            {":french_guiana:","🇬🇫"},
            {":guernsey:","🇬🇬"},
            {":ghana:","🇬🇭"},
            {":gibraltar:","🇬🇮"},
            {":greenland:","🇬🇱"},
            {":gambia:","🇬🇲"},
            {":guinea:","🇬🇳"},
            {":guadeloupe:","🇬🇵"},
            {":equatorial_guinea:","🇬🇶"},
            {":greece:","🇬🇷"},
            {":south_georgia_south_sandwich_islands:","🇬🇸"},
            {":guatemala:","🇬🇹"},
            {":guam:","🇬🇺"},
            {":guinea_bissau:","🇬🇼"},
            {":guyana:","🇬🇾"},
            {":hong_kong:","🇭🇰"},
            {":heard_mcdonald_islands:","🇭🇲"},
            {":honduras:","🇭🇳"},
            {":croatia:","🇭🇷"},
            {":haiti:","🇭🇹"},
            {":hungary:","🇭🇺"},
            {":canary_islands:","🇮🇨"},
            {":indonesia:","🇮🇩"},
            {":ireland:","🇮🇪"},
            {":israel:","🇮🇱"},
            {":isle_of_man:","🇮🇲"},
            {":india:","🇮🇳"},
            {":british_indian_ocean_territory:","🇮🇴"},
            {":iraq:","🇮🇶"},
            {":iran:","🇮🇷"},
            {":iceland:","🇮🇸"},
            {":jersey:","🇯🇪"},
            {":jamaica:","🇯🇲"},
            {":jordan:","🇯🇴"},
            {":kenya:","🇰🇪"},
            {":kyrgyzstan:","🇰🇬"},
            {":cambodia:","🇰🇭"},
            {":kiribati:","🇰🇮"},
            {":comoros:","🇰🇲"},
            {":st_kitts_nevis:","🇰🇳"},
            {":north_korea:","🇰🇵"},
            {":kuwait:","🇰🇼"},
            {":cayman_islands:","🇰🇾"},
            {":kazakhstan:","🇰🇿"},
            {":laos:","🇱🇦"},
            {":lebanon:","🇱🇧"},
            {":st_lucia:","🇱🇨"},
            {":liechtenstein:","🇱🇮"},
            {":sri_lanka:","🇱🇰"},
            {":liberia:","🇱🇷"},
            {":lesotho:","🇱🇸"},
            {":lithuania:","🇱🇹"},
            {":luxembourg:","🇱🇺"},
            {":latvia:","🇱🇻"},
            {":libya:","🇱🇾"},
            {":morocco:","🇲🇦"},
            {":monaco:","🇲🇨"},
            {":moldova:","🇲🇩"},
            {":montenegro:","🇲🇪"},
            {":st_martin:","🇲🇫"},
            {":madagascar:","🇲🇬"},
            {":marshall_islands:","🇲🇭"},
            {":macedonia:","🇲🇰"},
            {":mali:","🇲🇱"},
            {":myanmar:","🇲🇲"},
            {":mongolia:","🇲🇳"},
            {":macau:","🇲🇴"},
            {":northern_mariana_islands:","🇲🇵"},
            {":martinique:","🇲🇶"},
            {":mauritania:","🇲🇷"},
            {":montserrat:","🇲🇸"},
            {":malta:","🇲🇹"},
            {":mauritius:","🇲🇺"},
            {":maldives:","🇲🇻"},
            {":malawi:","🇲🇼"},
            {":mexico:","🇲🇽"},
            {":malaysia:","🇲🇾"},
            {":mozambique:","🇲🇿"},
            {":namibia:","🇳🇦"},
            {":new_caledonia:","🇳🇨"},
            {":niger:","🇳🇪"},
            {":norfolk_island:","🇳🇫"},
            {":nigeria:","🇳🇬"},
            {":nicaragua:","🇳🇮"},
            {":netherlands:","🇳🇱"},
            {":norway:","🇳🇴"},
            {":nepal:","🇳🇵"},
            {":nauru:","🇳🇷"},
            {":niue:","🇳🇺"},
            {":new_zealand:","🇳🇿"},
            {":oman:","🇴🇲"},
            {":panama:","🇵🇦"},
            {":peru:","🇵🇪"},
            {":french_polynesia:","🇵🇫"},
            {":papua_new_guinea:","🇵🇬"},
            {":philippines:","🇵🇭"},
            {":pakistan:","🇵🇰"},
            {":poland:","🇵🇱"},
            {":st_pierre_miquelon:","🇵🇲"},
            {":pitcairn_islands:","🇵🇳"},
            {":puerto_rico:","🇵🇷"},
            {":palestinian_territories:","🇵🇸"},
            {":portugal:","🇵🇹"},
            {":palau:","🇵🇼"},
            {":paraguay:","🇵🇾"},
            {":qatar:","🇶🇦"},
            {":reunion:","🇷🇪"},
            {":romania:","🇷🇴"},
            {":serbia:","🇷🇸"},
            {":rwanda:","🇷🇼"},
            {":saudi_arabia:","🇸🇦"},
            {":solomon_islands:","🇸🇧"},
            {":seychelles:","🇸🇨"},
            {":sudan:","🇸🇩"},
            {":sweden:","🇸🇪"},
            {":singapore:","🇸🇬"},
            {":st_helena:","🇸🇭"},
            {":slovenia:","🇸🇮"},
            {":svalbard_jan_mayen:","🇸🇯"},
            {":slovakia:","🇸🇰"},
            {":sierra_leone:","🇸🇱"},
            {":san_marino:","🇸🇲"},
            {":senegal:","🇸🇳"},
            {":somalia:","🇸🇴"},
            {":suriname:","🇸🇷"},
            {":south_sudan:","🇸🇸"},
            {":sao_tome_principe:","🇸🇹"},
            {":el_salvador:","🇸🇻"},
            {":sint_maarten:","🇸🇽"},
            {":syria:","🇸🇾"},
            {":swaziland:","🇸🇿"},
            {":tristan_da_cunha:","🇹🇦"},
            {":turks_caicos_islands:","🇹🇨"},
            {":chad:","🇹🇩"},
            {":french_southern_territories:","🇹🇫"},
            {":togo:","🇹🇬"},
            {":thailand:","🇹🇭"},
            {":tajikistan:","🇹🇯"},
            {":tokelau:","🇹🇰"},
            {":timor_leste:","🇹🇱"},
            {":turkmenistan:","🇹🇲"},
            {":tunisia:","🇹🇳"},
            {":tonga:","🇹🇴"},
            {":tr:","🇹🇷"},
            {":trinidad_tobago:","🇹🇹"},
            {":tuvalu:","🇹🇻"},
            {":taiwan:","🇹🇼"},
            {":tanzania:","🇹🇿"},
            {":ukraine:","🇺🇦"},
            {":uganda:","🇺🇬"},
            {":us_outlying_islands:","🇺🇲"},
            {":united_nations:","🇺🇳"},
            {":uruguay:","🇺🇾"},
            {":uzbekistan:","🇺🇿"},
            {":vatican_city:","🇻🇦"},
            {":st_vincent_grenadines:","🇻🇨"},
            {":venezuela:","🇻🇪"},
            {":british_virgin_islands:","🇻🇬"},
            {":us_virgin_islands:","🇻🇮"},
            {":vietnam:","🇻🇳"},
            {":vanuatu:","🇻🇺"},
            {":wallis_futuna:","🇼🇫"},
            {":samoa:","🇼🇸"},
            {":kosovo:","🇽🇰"},
            {":yemen:","🇾🇪"},
            {":mayotte:","🇾🇹"},
            {":south_africa:","🇿🇦"},
            {":zambia:","🇿🇲"},
            {":zimbabwe:","🇿🇼"}
        };
    }

    /// <summary>
    /// Gets a new instance of the default smiley to emoji shortcode dictionary.
    /// It can be used to create a customized <see cref="EmojiMapping"/>.
    /// </summary>
    public static IDictionary<string, string> GetDefaultSmileyToEmojiShortcode()
    {
        return new Dictionary<string, string>(71)
        {
            {">:(", ":angry:"},
            {">:-(", ":angry:"},
            {":\")", ":blush:"},
            {":-\")", ":blush:"},
            {"</3", ":broken_heart:"},
            {"<\\3", ":broken_heart:"},
            {":/", ":confused:"},
            {":-/", ":confused:"},
            {":'(", ":cry:"},
            {":'-(", ":cry:"},
            {":,(", ":cry:"},
            {":,-(", ":cry:"},
            {":(", ":frowning:"},
            {":-(", ":frowning:"},
            {"<3", ":heart:"},
            {"]:(", ":imp:"},
            {"]:-(", ":imp:"},
            {"o:)", ":innocent:"},
            {"O:)", ":innocent:"},
            {"o:-)", ":innocent:"},
            {"O:-)", ":innocent:"},
            {"0:)", ":innocent:"},
            {"0:-)", ":innocent:"},
            {":')", ":joy:"},
            {":'-)", ":joy:"},
            {":,)", ":joy:"},
            {":,-)", ":joy:"},
            {":'D", ":joy:"},
            {":'-D", ":joy:"},
            {":,D", ":joy:"},
            {":,-D", ":joy:"},
            {":*", ":kissing:"},
            {":-* ", ":kissing:"},
            {"x-)", ":laughing:"},
            {"X-) ", ":laughing:"},
            {":|", ":neutral_face:"},
            {":-| ", ":neutral_face:"},
            {":o", ":open_mouth:"},
            {":-o", ":open_mouth:"},
            {":O", ":open_mouth:"},
            {":-O", ":open_mouth:"},
            {":@", ":rage:"},
            {":-@", ":rage:"},
            {":D", ":smile:"},
            {":-D", ":smile:"},
            {":)", ":smiley:"},
            {":-)", ":smiley:"},
            {"]:)", ":smiling_imp:"},
            {"]:-)", ":smiling_imp:"},
            {":,'(", ":sob:"},
            {":,'-(", ":sob:"},
            {";(", ":sob:"},
            {";-(", ":sob:"},
            {":P", ":stuck_out_tongue:"},
            {":-P", ":stuck_out_tongue:"},
            {"8-)", ":sunglasses:"},
            {"B-)", ":sunglasses:"},
            {":s", ":unamused:"},
            {":-S", ":unamused:"},
            {":z", ":unamused:"},
            {":-Z", ":unamused:"},
            {":$", ":unamused:"},
            {":-$", ":unamused:"},
            {";)", ":wink:"},
            {";-)", ":wink:"},

            // Custom arrows
            {"<-", ":custom_arrow_left:" },
            {"->", ":custom_arrow_right:" },
            {"<->", ":custom_arrow_left_right:" },

            {"<=", ":custom_arrow_left_strong:" },
            {"=>", ":custom_arrow_right_strong:" },
            {"<=>", ":custom_arrow_left_right_strong:" },
        };
    }

    #endregion

    /// <summary>
    /// Constructs a mapping for the default emoji shortcodes and smileys.
    /// </summary>
    public EmojiMapping(bool enableSmileys = true)
        : this(GetDefaultEmojiShortcodeToUnicode(),
              enableSmileys ? GetDefaultSmileyToEmojiShortcode() : new Dictionary<string, string>())
    { }

    /// <summary>
    /// Constructs a mapping from a dictionary of emoji shortcodes to unicode, and a dictionary of smileys to emoji shortcodes.
    /// </summary>
    public EmojiMapping(IDictionary<string, string> shortcodeToUnicode, IDictionary<string, string> smileyToShortcode)
    {
        if (shortcodeToUnicode is null)
            ThrowHelper.ArgumentNullException(nameof(shortcodeToUnicode));

        if (smileyToShortcode is null)
            ThrowHelper.ArgumentNullException(nameof(smileyToShortcode));

        // Build emojis and smileys CompactPrefixTree

        int jointCount = shortcodeToUnicode.Count + smileyToShortcode.Count;

        // Count * 2 seems to be a good fit for the data set
        PrefixTree = new CompactPrefixTree<string>(jointCount, jointCount * 2, jointCount * 2);

        // This is not the best data set for the prefix tree as it will have to check the first character linearly
        // A work-around would require a bunch of substrings / removing the leading ':' from emojis, neither one is pretty
        // This way we sacrifice a few microseconds for not introducing breaking changes, emojis aren't all that common anyhow

        var firstChars = new HashSet<char>();

        foreach (var shortcode in shortcodeToUnicode)
        {
            if (string.IsNullOrEmpty(shortcode.Key) || string.IsNullOrEmpty(shortcode.Value))
                ThrowHelper.ArgumentException("The dictionaries cannot contain null or empty keys/values", nameof(shortcodeToUnicode));

            firstChars.Add(shortcode.Key[0]);
            PrefixTree.Add(shortcode);
        }

        foreach (var smiley in smileyToShortcode)
        {
            if (string.IsNullOrEmpty(smiley.Key) || string.IsNullOrEmpty(smiley.Value))
                ThrowHelper.ArgumentException("The dictionaries cannot contain null or empty keys/values", nameof(smileyToShortcode));

            if (!shortcodeToUnicode.TryGetValue(smiley.Value, out string? unicode))
                ThrowHelper.ArgumentException(string.Format("Invalid smiley target: {0} is not present in the emoji shortcodes dictionary", smiley.Value));

            firstChars.Add(smiley.Key[0]);

            if (!PrefixTree.TryAdd(smiley.Key, unicode))
                ThrowHelper.ArgumentException(string.Format("Smiley {0} is already present in the emoji mapping", smiley.Key));
        }

        OpeningCharacters = [.. firstChars];
    }
}